// https://leetcode.cn/problems/JEj789/

// 题干：假如有一排房子，共 n 个，每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种，
//      你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。
//      当然，因为市场上不同颜色油漆的价格不同，所以房子粉刷成不同颜色的花费成本也是不同的。
//      每个房子粉刷成不同颜色的花费是以一个 n x 3 的正整数矩阵 costs 来表示的。
//      例如，costs[0][0] 表示第 0 号房子粉刷成红色的成本花费；costs[1][2] 表示第 1 号房子粉刷成绿色的花费，以此类推。
//      请计算出粉刷完所有房子最少的花费成本

// 示例：输入: costs = [[17,2,17],[16,16,5],[14,3,19]]
//      输出: 10

// 碎语：

#include <bits/stdc++.h>
using namespace std;

class Solution
{
public:
    int minCost(vector<vector<int>>& costs)
    {
        // 1.状态表示 到达某一位置的时候，可以有三种颜色选择
        // dp[i][0]表示粉刷到i位置的时候，最后一个位置粉刷上红色，此时的最小花费
        int n = costs.size();
        vector<vector<int>> dp(n + 1, vector<int>(3));

        for (int i = 1 ; i <= n ; i++){
            dp[i][0] = min(dp[i - 1][1], dp[i - 1][2]) + costs[i - 1][0];
            dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]) + costs[i - 1][1];
            dp[i][2] = min(dp[i - 1][0], dp[i - 1][1]) + costs[i - 1][2];
        }

        // 4.填表顺序 从左往右
        // 5.返回值
        return min(min(dp[n][0], dp[n][1]), dp[n][2]);
    }
};

int main()
{
    Solution sol;
    vector<vector<int>> costs = {{17,2,17},{16,16,5},{14,3,19}};

    cout << sol.minCost(costs) << endl;

    return 0;
}












